package com.code2roc.jarmanage.util;

import com.alibaba.fastjson.JSONObject;
import org.dom4j.Element;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ImportConvert {
    private static List<String> dateFormats = Arrays.asList("yyyy-MM-dd HH:mm:ss", "MM/dd/yyyy HH:mm:ss","dd-MM-yyyy HH:mm:ss","yyyyMMddHHmmss","yyyyMMdd","yyyy-MM-dd");
    public static <T> T convertModel(Class<T> clazz, Element dataEntity) throws Exception {
        T entity = clazz.newInstance();
        for (Field field : clazz.getDeclaredFields()) {
            if (!Modifier.isStatic(field.getModifiers())) {
                field.setAccessible(true);
                Element filednode = dataEntity.element(field.getName());
                if (filednode != null) {
                    field.set(entity, convetXmlContent2FieldContent(filednode.getText(), field.getType()));
                }
            }
        }
        return entity;
    }

    public static Object convetXmlContent2FieldContent(String content, Class filedClass) throws Exception {
        Object result = null;

        if (filedClass == String.class) {
            result = ConvertUtil.convert2String(content);
        }
        if (StringUtil.isEmpty(content)) return result;
        if (filedClass == Map.class) {
            result = JSONObject.parseObject(content, HashMap.class);
        } else if (filedClass == Integer.TYPE || filedClass == Integer.class) {
            result = ConvertUtil.convert2Int(content);
        } else if (filedClass == Double.TYPE || filedClass == Double.class) {
            result = ConvertUtil.convert2Double(content);
        } else if (filedClass == Boolean.TYPE || filedClass == Boolean.class) {
            result = ConvertUtil.convert2Boolean(content);
        } else if (filedClass == BigDecimal.class) {
            if (content.contains(",")){
                content = content.replaceAll(",","").replaceAll(" ","").replaceAll("%","");
            }
            result = tryConvertToBigDecimal(content);
        } else if (filedClass == Date.class) {
            result = parseDateTime(content,dateFormats);
        }
        return result;
    }

    /**
     * 尝试将字符串转换为 BigDecimal，如果转换失败则返回 null。
     *
     * @param content 待转换的字符串
     * @return 转换后的 BigDecimal 对象，或者在转换失败时返回 null
     */
    public static BigDecimal tryConvertToBigDecimal(String content) {
        if (content == null || content.isEmpty()) {
            return null;
        }

        // 正则表达式匹配正负整数或正负小数
        String regex = "-?\\d+(\\.\\d+)?";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(content);

        // 检查整个字符串是否匹配正则表达式
        if (matcher.matches()) {
            try {
                // 尝试转换为 BigDecimal
                return new BigDecimal(content);
            } catch (NumberFormatException e) {
                // 如果转换失败，返回 null
                return null;
            }
        } else {
            // 如果字符串不匹配正则表达式，直接返回 null
            return null;
        }
    }


    /**
     * 尝试使用提供的格式列表解析日期时间字符串。
     *
     * @param content 待解析的日期时间字符串
     * @param dateFormats 格式列表
     * @return 解析成功的 Date 对象，或者在所有格式都失败时返回 null
     */
    public static Date parseDateTime(String content, List<String> dateFormats) {
        if (content == null || content.trim().isEmpty()) {
            return null;
        }

        for (String dateFormat : dateFormats) {
            try {
                SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
                sdf.setLenient(false); // 严格模式
                return sdf.parse(content);
            } catch (ParseException e) {
                // 如果当前格式失败，继续尝试下一个格式
            }
        }

        // 如果所有格式都失败，返回 null
        return null;
    }

}
